package menuimpl

import (
	"context"
	"go-caipu/pkg/services/admin/menu"
	"go-caipu/pkg/services/admin/model"
	"go-caipu/pkg/util"
)

// GetMenuWithRoleNew 首页登录后查询导航主菜单
func (m sqlStore) GetMenuWithRoleNew(ctx context.Context, roleIds []string) (result []*menu.MainMenu, err error) {
	var models []model.SysMenu
	// 查找所有可使用菜单项
	err = m.db.Where(" status='1' ").Order("sort").Find(&models).Error
	if err != nil {
		return nil, err
	}

	var roleMenu []int64
	// 管理员角色
	if util.Contains(roleIds, "1828271398028574720") {
		//所有菜单项
		for _, model := range models {
			if model.MenuType == 3 {
				roleMenu = append(roleMenu, model.MenuId)
			}
		}
	} else {
		err = m.db.Table("sys_role_menu").Where(" role_id IN ?", roleIds).Select("menu_id").Find(&roleMenu).Error
		if err != nil {
			return nil, err
		}
	}
	//创建id到分类的映射
	menuMap := make(map[int64]*model.SysMenu)
	for i, item := range models {
		menuMap[item.MenuId] = &models[i]
	}
	//收集所有需要包含的节点（包括给定子节点和父节点）
	nodeSet := make(map[int64]bool)
	//用于递归查找父节点的函数
	var findParent func(int64)
	findParent = func(id int64) {
		if id == 0 || nodeSet[id] {
			return
		}
		nodeSet[id] = true

		if parent, ok := menuMap[id]; ok {
			if parent.ParentId != 0 {
				findParent(parent.ParentId)
			}
		}
	}
	// 构建树结构
	for _, id := range roleMenu {
		findParent(id)
	}
	//创建所有需要节点的副本，避免修改原始数据
	tempNodes := make(map[int64]*menu.MainMenu)
	for v := range nodeSet {
		if item, exists := menuMap[v]; exists {
			if item.MenuType == 3 { //按钮
				continue
			}
			menu := generateMenu(*item)
			tempNodes[v] = &menu
		}
	}
	// 构建树结构
	rootNodes := []*menu.MainMenu{}

	//构建父子关系
	for _, node := range tempNodes {
		if node.ParentId == 0 {
			rootNodes = append(rootNodes, node)
		} else {
			if parent, exists := tempNodes[node.ParentId]; exists {
				parent.Children = append(parent.Children, node)
			}
		}
	}
	return rootNodes, nil
}
func generateMenu(dt model.SysMenu) menu.MainMenu {
	mi := menu.MainMenu{}
	mi.MenuId = dt.MenuId
	mi.Title = dt.Title
	mi.ParentId = dt.ParentId
	mi.Type = dt.MenuType
	mi.Path = dt.Path
	mi.Name = dt.MenuName
	mi.Component = dt.Component
	mi.Redirect = dt.Redirect
	mi.Icon = dt.Icon
	mi.IsExternal = true
	mi.Hidden = dt.Visible
	mi.IsCache = dt.NoCache
	//mi.Roles = dt.Auths
	mi.Order = dt.Sort
	mi.Status = dt.Status
	mi.Children = nil
	return mi
}
